形态学重建之孔洞填充 | 您所在的位置:网站首页 › matlab 图像填充 › 形态学重建之孔洞填充 |
白菜苗
1、什么是膨胀(如果已经了解,请往下看)2、什么是孔洞填充(如果已经了解,请往下看)3、什么是形态学重建(如果已经了解,请往下看)4、什么是测地膨胀(如果已经了解,请往下看)5、什么是形态学重建之孔洞填充(终于到正题了)6、实验
如果你不小心又亦或是专门寻找形态学相关知识,那么很高兴能和你们分享这篇文章。 首先,如果想了解形态学重建之孔洞填充原理,那么必须先了解什么是膨胀、什么是孔洞填充、什么是形态学重建、什么是测地膨胀,只有具备相关知识,我们才能把形态学重建之孔洞填充原理吃透。 话不多说!!我们看看 1、什么是膨胀(如果已经了解,请往下看)
那么怎么会这样呢?你可以这样理解,小正方形(即边长 d / 4 d/4 d/4的正方形)的中心可以在大的正方形里面运动,但是起不到膨胀效果,只有当它的中心点(即那个黑点)在边界运动时,是不是有 d / 8 d/8 d/8露在大正方形外面(看左边那个图),沿着边界绕一圈,是不是整个边长都会多了 d / 8 d/8 d/8,其实中心思想就是取并集,只要我的中心点在大正方形以内(包括边界),凡是能包含的地方,就是我俩共有的地方(即膨胀后的图形)。 同理可得: 孔洞:一个孔洞可以被定义为由前景像素相连接的边界所包围的一个背景区域。(左到右依次是未填充,填充一部分、填充完毕)
到此,填充完毕,如果你还纠结,那么我们思路理一下,例如
X
1
X_1
X1为什么从第一张图变成第二张,是因为图1,是膨胀后的,还需要
A
c
A^c
Ac补集约束一下,就是求个交集才是最后图形,其它以此类推,为什么到了
X
8
X_8
X8停下了呢,因为到这里已经收敛了,再膨胀也是
X
8
X_8
X8这张图形。
如果懂了,继续往下:用3*3的结构元 B B B去膨胀F。
然后多次迭代。
代码:(非我所写:参见链接) import numpy as np import cv2 as cv from matplotlib import pyplot as plt img = cv.imread("text.jpg") # 二值化 imgray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) imgray[imgray = 100] = 255 # 原图取补得到MASK图像 mask = 255 - imgray # 构造Marker图像 marker = np.zeros_like(imgray) marker[0, :] = 255 marker[-1, :] = 255 marker[:, 0] = 255 marker[:, -1] = 255 marker_0 = marker.copy() # 形态学重建 SE = cv.getStructuringElement(shape=cv.MORPH_CROSS, ksize=(3, 3)) while True: marker_pre = marker dilation = cv.dilate(marker, kernel=SE) marker = np.min((dilation, mask), axis=0) if (marker_pre == marker).all(): break dst = 255 - marker filling = dst - imgray # 显示 plt.figure(figsize=(12, 6)) # width * height plt.subplot(2, 3, 1), plt.imshow(imgray, cmap='gray'), plt.title('src'), plt.axis("off") plt.subplot(2, 3, 2), plt.imshow(mask, cmap='gray'), plt.title('Mask'), plt.axis("off") plt.subplot(2, 3, 3), plt.imshow(marker_0, cmap='gray'), plt.title('Marker 0'), plt.axis("off") plt.subplot(2, 3, 4), plt.imshow(marker, cmap='gray'), plt.title('Marker'), plt.axis("off") plt.subplot(2, 3, 5), plt.imshow(dst, cmap='gray'), plt.title('dst'), plt.axis("off") plt.subplot(2, 3, 6), plt.imshow(filling, cmap='gray'), plt.title('Holes'), plt.axis("off") plt.show()结果: 对于结构元的选择不宜过大,不然填充不上。
到 此 结 束 , 希 望 能 帮 助 到 你 \color{maroon}{到此结束,希望能帮助到你} 到此结束,希望能帮助到你 |
CopyRight 2018-2019 实验室设备网 版权所有 |